package gdf

import (
	"fmt"
	"gitee.com/liumou_site/logger"
	"net/http"
)

// DownLoadBuff 通过协程下载到缓存区,如果不支持分片下载则使用单线程下载
func (t *Thread) DownLoadBuff() error {
	if !t.SuppressRange {
		return fmt.Errorf("不支持分片下载")
	}
	start := int64(0)
	stop := t.Length
	if t.Debug {
		logger.Debug("当前设置单次下载长度: ", t.Length)
	}
	// 链接长度除以设置单次长度得出总次数
	LengthAdd := t.ContentLength / t.Length
	for s := 1; s < int(LengthAdd); s++ {
		// 循环遍历协程数量
		for i := 0; i < t.ThreadCount; i++ {
			//if start != 0 {
			//	start = stop + 1
			//	stop = stop + t.Length
			//}
			req, err := http.NewRequest("GET", t.FileUrl, nil)
			if err != nil {
				logger.Error(err)
				return err
			}
			req = setHeader(req)
			if stop >= t.ContentLength {
				stop = t.ContentLength
				if t.Debug {
					logger.Debug(fmt.Sprintf("协程下载[ %d ] - Start: [ %d ] - Stop: [ %d ]", i, start, stop))
				}
				// 创建协程
				t.WaitGroup.Add(1)
				// 设置范围
				//t.setRange(start, stop)
				setHeaderRange(req, start, stop)
				go t.get(req)
				t.Exit = true
				break
			} else {
				if t.Debug {
					logger.Debug(fmt.Sprintf("协程下载[ %d ] - Start: [ %d ] - Stop: [ %d ]", i, start, stop))
				}

				// 创建协程
				t.WaitGroup.Add(1)
				// 设置范围
				//t.setRange(start, stop)
				setHeaderRange(req, start, stop)
				start = stop + 1
				stop = stop + t.Length
				go t.get(req)
			}
		}
		// 等待所有协程结束
		t.WaitGroup.Wait()
		// 如果得到退出信号则退出
		if t.Exit {
			if t.Debug {
				logger.Debug("退出信号")
			}
			return nil
		}
	}
	return fmt.Errorf("未知错误")
}
